Estudio de la propagación y dinámica de precios a partir de la Matriz de Insumo-Producto (MIP)¶

Grupo: 6

Integrantes: Miguel De Lillo, Manuel Fernandez, Augusto Kielbowicz, Mariano Oca

Repositorio

Motivación¶

La idea de este modelo es estudiar, ante un shock de precios en un sector dado, cómo afectan las dinámicas propuestas entre los sectores productivos de la Argentina en la inflación global calculada a partir de las variaciones en los precios de los mismos. (Utilizando las relaciones dadas por la matriz de Insumo-Producto).

grafo

inlfacion

  • Introducción
    • Preguntas a responder
    • Suposiciones (y limitaciones) del Modelo-del-Modelo)
    • Descripción del Modelo
    • Matriz Insumo Producto (MIP)
  • Análisis de la MIP
    • Grafo
      • Distribución del grado de los nodos
      • Centralidad de los nodos
  • Experimentos
  • Conclusiones
  • Apéndices
    • Código

Introducción¶

Inflación estructural: La inflación estructural se refiere a un tipo de inflación causada por desajustes sectoriales que afectan a productos específicos, lo que resulta en aumentos de precios individuales que luego se generalizan. Estos desajustes pueden ser el resultado de la rigidez de la estructura productiva y la imperfección de los mercados, y son ajenos a las decisiones de las autoridades monetarias. La inflación estructural se origina en desequilibrios sectoriales que afectan a productos específicos y no en un desajuste global entre la oferta y la demanda monetaria.

Olivera, Julio H. G. (1965), "Inflación estructural y política financiera”.

Preguntas a Responder¶

  • ¿Cómo se propaga el aumento de precios a través de la red definida por la MIP?
  • ¿Cómo impacta el aumento de precio en un producto/sector sobre otros productos/sectores? ¿Se mantiene en la misma cadena productiva?
  • ¿Cómo influyen la dinámica de comportamiento de los agentes en la variación de la inflación global?
  • ¿Cuál es la sensibilidad del sistema respecto a variaciones de precio en nodos específicos? ¿Cuáles son los nodos que propagan de mayor forma la variación de precios?

Descripción del Modelo¶

  • Cada sector productivo de la Argentina es representado por un nodo del digrafo. El mismo representaría a todos los productos (y productores) del sector.
  • Cada arista del digrafo representa la relación "le vende a" donde el peso de la arista es el porcentaje de la producción total que es comparada.
  • Tanto los sectores productivos como los pesos que le corresponden a cada arista son extraídos de la Matriz Inzumo Producto del 1997 publicada por el INDEC. Los valores de dicha matriz son normalizados para que representen porcentajes, afines a la experimentación que se quiere realizar sobre el modelo.

Suposiciones (y limitaciones) del Modelo¶

  • Un cambio de precios >0 en los insumos provoca un cambio de precios saliente del agente (producción). Sólo vamos a estudiar variaciones positivas en los precios para atenernos a las preguntas a investigar con el modelo.
  • La economía es cerrada. Esto es, no se traen productos de otros países (importaciones) ni se vende nada a ellos (exportaciones) durante la evolución del sistema.
  • Rige la Ley de Say: la oferta es igual a la demanda.

Matriz Insumo Producto¶

Cargamos la matriz insumo producto normalizada por demanda saliente.

In [3]:
mip = pd.read_csv('../resources/MIP_normalizada.csv', index_col=0)
mip.shape
Out[3]:
(123, 123)
In [4]:
mip.head()
Out[4]:
Cultivo de cereales, oleaginosas y forrajeras Cultivo de hortalizas, legumbres, flores y plantas ornamentales Cultivo de frutas y nueces Cultivos industriales Producción de semillas Cría de ganado y producción de leche, lana y pelos Producción de granja Servicios agropecuarios Caza Silvicultura y extracción de madera ... Enseñanza pública Enseñanza privada Salud humana pública Salud humana privada Servicios veterinarios Servicios sociales Servicios de saneamiento Actividad de asociaciones Servicios de cine, radio y televisión Servicios personales, de reparación, actividades deportivas y de esparcimiento
Cultivo de cereales, oleaginosas y forrajeras 0.010319 0.000000 0.001542 0.001601 0.00000 0.181660 0.012263 0.0 0.0 0.0 ... 0.000038 0.000080 0.000007 0.000042 0.000012 0.000000 0.0 0.000000 1.735054e-09 0.003256
Cultivo de hortalizas, legumbres, flores y plantas ornamentales 0.000000 0.167226 0.009565 0.000000 0.00000 0.000000 0.000000 0.0 0.0 0.0 ... 0.005679 0.012030 0.002192 0.008913 0.000000 0.001238 0.0 0.007999 1.237709e-06 0.079292
Cultivo de frutas y nueces 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.0 0.0 0.0 ... 0.003827 0.008099 0.011067 0.005904 0.000000 0.001638 0.0 0.000000 1.472092e-07 0.000006
Cultivos industriales 0.000000 0.000000 0.000000 0.020212 0.00000 0.000000 0.000000 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000e+00 0.000000
Producción de semillas 0.783146 0.016374 0.029820 0.017254 0.02174 0.127875 0.002291 0.0 0.0 0.0 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000e+00 0.000000

5 rows × 123 columns

Análisis de la MIP¶

Grafo¶

Veamos cómo se ve esta red.

In [5]:
fig_gr_centralizado = grafo.verGrafoCentralizado(mip.to_numpy())
No description has been provided for this image

Intentemos separar los sectores para poder tener una mirada amplia.

In [6]:
fig_gr_abierto = grafo.verGrafoAbierto(mip)
No description has been provided for this image

Distribución de grado¶

Veremos cómo se distribuye el grado en la red. Para tener una noción de qué está pasando.

In [8]:
G = nx.DiGraph(mip)
fig_dist_grados = grafo.graficar_dist_grados(G, mip.columns)
Media del Grado de salida:63.31707317073171
Desvio del Grado de salida:1961.1108467182228
Media del Grado de entrada:63.31707317073171
Desvio del Grado de entrada:162.3791394011501
No description has been provided for this image

Centralidad de autovectores¶

La centralidad de autovalores mide la influencia de un nodo sobre la red basado en la influencia de sus vecinos. Elegimos esta métrica para analizar el grafo pues los nodos que poseen un valor alto de esta medida de centralidad están conectados a otros nodos que a su vez son muy relevantes, en el sentido de la misma medida, o bien a muchos otros nodos, quizás menos relevantes. Por el contrario, los nodos conectados a otros nodos periféricos o poco relevantes, tendrán una baja centralidad de autovectores.

In [9]:
fig_dist_centralidad = grafo.graficar_dist_centralidad(G, mip.columns)
No description has been provided for this image

Los experimentos¶

En esta etapa, haremos un análisis de la divergencia y convergencia de la inflación. Para 4 valores de alfa distintos, vamos a hacer un shock inflacionario en cada uno de los 123 sectores productivos y computaremos la media móvil de la inflación entre estas 123 simulaciones para cada alfa. Además, mostraremos el grafo resultante luego de la evolución del sistema para dos sectores representativos de niveles de centralidad alto y bajo, respectivamente.

In [10]:
alfa0= pd.read_csv('../resources/alpha00.csv', index_col= 0)
alfa02= pd.read_csv('../resources/alpha02.csv', index_col= 0)
alfa03 = pd.read_csv('../resources/alpha03.csv', index_col= 0)
alfa04= pd.read_csv('../resources/alpha04.csv', index_col= 0)
In [11]:
exp.Experimento?
Init signature:
exp.Experimento(
    grafo,
    dinamica,
    duracion_periodo=10,
    metricas=None,
    calcular_inflacion=None,
    alpha=0.5,
)
Docstring:      <no docstring>
Init docstring:
Inicializa una instancia de la clase Experimento.

Parámetros
----------
grafo : DiGraph
  Grafo que representa el MIP
dinamica : Callable 
  Función con la siguiente signatura : (aumento, peso_arista, inflacion, alpha)
duracion_periodo : int, opcional
    La duración de cada período en pasos para actualizar la inflacion, por defecto 10 pasos.
metricas : Dict(string,Callable), opcional
    Diccionario de con metricas a computar sobre el grafo, ej, {"cantidad_nodos", lambda grafo: len(grafo)}
calcular_inflacion : Callable, opcional
    Función para calcular la inflación en un período, recibe dos arrays de precios. ej, calc(precios_actual, precios_pasado)
alpha : float, opcional
    Parametro de ponderacion
    El alpha es CUANTO ve la inflación. 
    Alpha == 1 es lo mismo que la dinamica 2. 
    Alpha == 0 es lo mismo que la dinamica 1.
File:           c:\users\augus\dev\gh\akielbowicz\tp-msscae-2024\src\experimento.py
Type:           type
Subclasses:     

Dinámicas¶

$dinamica_{local}(aumento, peso_{arista}, inflacion) = aumento * peso_{arista} $

$dinamica_{global}(aumento, peso_{arista}, inflacion) = inflacion$

$dinamica_{mixta}(aumento, peso_{arista}, inflacion, \alpha) = \alpha * inflacion + (1 - \alpha) * aumento * peso_{arista} $

Experimentación con la dinámica local.¶

Veamos qué sucede con:

  • un sector muy central: Administración pública y defensa y planes de la seguridad social de afiliación obligatoria
  • otro poco central: Instituciones Financieras
In [12]:
def calcular_precios(mip, sector, dinamica, alpha=0.0):
    mip_grafo = grafo.armar_grafo(mip, precios_random=False)
    experimento = exp.Experimento(mip_grafo,
                                    dinamica=dinamica,
                                    calcular_inflacion=modelo.calcular_inflacion,
                                    duracion_periodo=20,
                                    alpha=alpha)
    experimento.shock(sector,20)
    experimento.step(600)
    precios_finales =[]
    for sector in mip_grafo.nodes():
        precio = experimento.precios_periodo_pasado[sector]
        precios_finales.append(precio)
    
    precios_iniciales = [100 for _ in precios_finales]
    return precios_iniciales, precios_finales
In [13]:
sector = 'Administración pública y defensa y planes de la seguridad social de afiliación obligatoria'
precios_iniciales, precios_finales = calcular_precios(mip, sector, modelo.dinamica_local)
fig_inf = grafo.verInflacion(mip, precios_finales, precios_iniciales)
No description has been provided for this image
In [14]:
sector = 'Instituciones Financieras'
precios_iniciales, precios_finales = calcular_precios(mip, sector, modelo.dinamica_local)
fig_inf = grafo.verInflacion(mip, precios_finales, precios_iniciales)
No description has been provided for this image
In [15]:
def graficar_inflacion_para(mip_grafo, aumento, sectores=[]):
    inflaciones = []
    for sector in sectores:
        experimento = exp.Experimento(mip_grafo,
                                dinamica=modelo.dinamica_local,
                                calcular_inflacion=modelo.calcular_inflacion,
                                duracion_periodo=20)
        experimento.shock(sector,aumento)
        experimento.step(600)
        inflacion = experimento.metricas_evaluadas['inflacion']
        inflaciones.append(inflacion)  
    plot_inflaciones(inflaciones, sectores, aumento,3)
In [16]:
aumentos = [5, 20, 50]
In [17]:
mip_grafo = grafo.armar_grafo(mip,precios_random=False)

graficar_inflacion_para(mip_grafo, aumentos[0], sectores = list(mip_grafo.nodes))
No description has been provided for this image
In [18]:
graficar_inflacion_para(mip_grafo, aumentos[1], sectores = list(mip_grafo.nodes))
No description has been provided for this image
In [19]:
graficar_inflacion_para(mip_grafo, aumentos[2], sectores = list(mip_grafo.nodes))
No description has been provided for this image

Experimentos con las dinámicas.¶

Alpha = 0¶

In [20]:
alpha = 0
In [21]:
aumentos = [20]

sectores = list(mip_grafo.nodes)
for j, aumento in enumerate(aumentos):       
    inflaciones = []
    for sector in sectores:
        experimento = exp.Experimento(mip_grafo,
                                dinamica=modelo.dinamica_mixta,
                                calcular_inflacion=modelo.calcular_inflacion,
                                alpha=alpha)
        experimento.shock(sector,aumento)
        experimento.step(200)
        inflacion = experimento.metricas_evaluadas['inflacion']
        inflaciones.append(inflacion)  
    plot_inflaciones(inflaciones, sectores, aumento)
No description has been provided for this image
In [22]:
verEvolucion(alfa0, 'Alfa = 0')
Out[22]:
No description has been provided for this image
No description has been provided for this image

Alpha = 0.2¶

In [23]:
alpha = 0.2
In [24]:
sector = 'Administración pública y defensa y planes de la seguridad social de afiliación obligatoria'

precios_iniciales, precios_finales = calcular_precios(mip, sector, modelo.dinamica_mixta, alpha=alpha)
fig_inf = grafo.verInflacion(mip, precios_finales, precios_iniciales)
No description has been provided for this image
In [25]:
sector = 'Instituciones Financieras'
precios_iniciales, precios_finales = calcular_precios(mip, sector, modelo.dinamica_mixta, alpha=alpha)
fig_inf = grafo.verInflacion(mip, precios_finales, precios_iniciales)
No description has been provided for this image
In [26]:
aumentos = [20]
umbral_visualizacion = [1000,2000,2000]

sectores = list(mip_grafo.nodes)
for j, aumento in enumerate(aumentos):       
    inflaciones = []
    for sector in sectores:
        experimento = exp.Experimento(mip_grafo,
                                dinamica=modelo.dinamica_mixta,
                                calcular_inflacion=modelo.calcular_inflacion,
                                alpha=alpha)
        experimento.shock(sector,aumento)
        experimento.step(500)
        inflacion = experimento.metricas_evaluadas['inflacion']
        inflaciones.append(inflacion)  

    plot_inflaciones(inflaciones, sectores, aumento,0.5)
No description has been provided for this image
In [27]:
verEvolucion(alfa02, f'Alfa = {alpha}')
Out[27]:
No description has been provided for this image
No description has been provided for this image

Alpha 0.3¶

In [28]:
alpha = 0.3
In [29]:
sector = 'Administración pública y defensa y planes de la seguridad social de afiliación obligatoria'
precios_iniciales, precios_finales = calcular_precios(mip, sector, modelo.dinamica_mixta, alpha=alpha)
fig_inf = grafo.verInflacion(mip, precios_finales, precios_iniciales)
No description has been provided for this image
In [30]:
sector = 'Instituciones Financieras'
precios_iniciales, precios_finales = calcular_precios(mip, sector, modelo.dinamica_mixta, alpha=alpha)
fig_inf = grafo.verInflacion(mip, precios_finales, precios_iniciales)
No description has been provided for this image
In [31]:
aumento = 20
# umbral_visualizacion = [1000]

sectores = list(mip_grafo.nodes)
inflaciones = []
for sector in sectores:
    experimento = exp.Experimento(mip_grafo,
                            dinamica=modelo.dinamica_3,
                            calcular_inflacion=modelo.calcular_inflacion,
                            alpha=alpha)
    experimento.shock(sector,aumento)
    experimento.step(90)
    inflacion = experimento.metricas_evaluadas['inflacion']
    inflaciones.append(inflacion)  
plot_inflaciones(inflaciones, sectores, aumento,3)
Out[31]:
No description has been provided for this image
No description has been provided for this image
In [32]:
verEvolucion(alfa03, f'Alfa = {alpha}')
Out[32]:
No description has been provided for this image
No description has been provided for this image

El mismo experimento pero con más pasos.¶

In [33]:
aumento = 20

sectores = list(mip_grafo.nodes)
inflaciones = []
for sector in sectores:
    experimento = exp.Experimento(mip_grafo,
                            dinamica=modelo.dinamica_3,
                            calcular_inflacion=modelo.calcular_inflacion,
                            alpha=alpha)
    experimento.shock(sector,aumento)
    experimento.step(110)
    inflacion = experimento.metricas_evaluadas['inflacion']
    inflaciones.append(inflacion)  
plot_inflaciones(inflaciones, sectores, aumento,50)
Out[33]:
No description has been provided for this image
No description has been provided for this image

Alpha 0.6¶

In [34]:
alpha = 0.6
In [35]:
sector = 'Administración pública y defensa y planes de la seguridad social de afiliación obligatoria'
precios_iniciales, precios_finales = calcular_precios(mip, sector, modelo.dinamica_mixta, alpha=alpha)
fig_inf = grafo.verInflacion(mip, precios_finales, precios_iniciales)
No description has been provided for this image
In [36]:
sector = ('Instituciones Financieras')
precios_iniciales, precios_finales = calcular_precios(mip, sector, modelo.dinamica_mixta, alpha=alpha)
fig_inf = grafo.verInflacion(mip, precios_finales, precios_iniciales)
No description has been provided for this image
In [37]:
aumento = 20
# umbral_visualizacion = [1000]
sectores = list(mip_grafo.nodes)
inflaciones = []
for sector in sectores:
    experimento = exp.Experimento(mip_grafo,
                            dinamica=modelo.dinamica_mixta,
                            calcular_inflacion=modelo.calcular_inflacion,
                            alpha=alpha)
    experimento.shock(sector,aumento)
    experimento.step(100)
    inflacion = experimento.metricas_evaluadas['inflacion']
    inflaciones.append(inflacion)  
plot_inflaciones(inflaciones, sectores, aumento,30000)
Out[37]:
No description has been provided for this image
No description has been provided for this image
In [38]:
verEvolucion(alfa04, f'Alfa = {alpha}')
Out[38]:
No description has been provided for this image
No description has been provided for this image

Conclusiones¶

Inflación Estructural¶

Podemos notar que este modelo apoya la noción de que la inflación tiene un origen estructural. El hecho de que exista un alfa tal que si el aumento local de precios en un sector productivo estuviese dado por alfa*inflación_global, podría ser interpretado como una descoordinación entre los agentes. Estos hitos en la red estarían dando lugar a una espiralización de la inflación del modelo, que podría ser interpretada como la generalización de aumentos de precios individuales.

Sobre los experimentos y las preguntas respondidas¶

  • ¿Cómo se propaga el aumento de precios a través de la red definida por la MIP?

La propagación de un shock en el sistema productivo varía dependiendo tanto del sector a cual se realiza el shock como del alpha del experimento. En nodos que estan fuertemente conectados con otros, que propagan más un aumento, los shocks tienen más impacto que en aquellos con grados o pesos menores en sus aristas.

  • ¿Cómo impacta el aumento de precio en un producto/sector sobre otros productos/sectores? ¿Se mantiene en la misma cadena productiva? ¿Cómo influyen la dinámica de comportamiento de los agentes en la variación de la inflación global?

Si el alpha es 0 el shock a un sector sólo genera cambios de precios en las aristas alcanzables por ese nodo. Además, como todos los pesos en las aristas son menores a 1, existe un decaimiento en los aumentos que se van pasando de sector a sector. Por otro lado, cuando el alpha aumenta y los agentes se ven cada vez más influenciados por la inflación global a la hora de aumentar sus precios, la respuesta ya no es tan clara. Para que un agente tome la decisión de aumentar su precio, le tiene que llegar un aumento, es decir, no tienen la capacidad de actualizarse si no les "avisan". Por eso, es técnicamente cierto que el aumento se propaga sólo en la cadena productiva del sector que es shockeado. Lo interesante del modelo es que, al no ser nosotros los que definimos esa cadena sino que generamos la topografía de la red a partir del MIP, estas cadenas productivas son muy complejas y logran capturar todas las dependendias que existen entre sectores. A partir de eso, cuando el alpha aumenta, sectores a los que le hubiese llegado un aumento casi residual en un primer momento, toman la decisión de aumentar sus precios viendo la variable macro y así comienzan a generar aumentos generalizados en toda la red, es decir, inflación.

Preguntas a responder¶

  • ¿Cuál es la sensibilidad del sistema respecto a variaciones de precio en nodos específicos? ¿Cuáles son los nodos que propagan de mayor forma la variación de precios?

Próximos pasos¶

  • El modelo en su estado actual calcula la inflación a partir de un IPC basado en una canasta básica sin ponderar. Como primer paso sería interesante agregar ponderaciones a los sectores para lograr un mejor modelo.
  • La MIP también tiene la información de cuánto de lo producido por un sector se vende al consumidor final. Con eso se puede generar un nuevo agente que represente ese sector, el del consumo final, y que tenga ciertos sectores más prioritarios que otros a la hora de consumirlo. Con eso, se podría eliminar el supuesto de la Ley de Say, agregando el consumo a las dinámicas. Eso podría dar lugar a deflación.
  • Clusterizar ciertos nodos del grado en rubros, y estudiar los shocks dentro de esos micro-sectores.
  • A partir de identificar los nodos en los cuales el grafo es mas vunlerable a un shock (Un shock en ellos generan significativamente más inflación que en el resto), plantear una reestructuración del grafo para hacerlo mas estable y seguro, teniendo en cuenta las restricciones pertinentes para que el grafo resultante siga siendo un esquema productivo.
  • Si se logra eliminar la Ley de Say, sería interesante reemplazar los sectores por agentes individuales de aquel sector, para poder modelar dinámicas de competencia en los precios.

Gracias!¶

¿Preguntas?¶

Apéndices¶

Código¶

  • Experimento
  • Dinámicas

Experimento¶

In [39]:
exp.Experimento??
Init signature:
exp.Experimento(
    grafo,
    dinamica,
    duracion_periodo=10,
    metricas=None,
    calcular_inflacion=None,
    alpha=0.5,
)
Docstring:      <no docstring>
Source:        
class Experimento:
  def __init__(self, grafo, dinamica, duracion_periodo = 10, metricas=None, calcular_inflacion=None, alpha = 0.5): 
    """
    Inicializa una instancia de la clase Experimento.

    Parámetros
    ----------
    grafo : DiGraph
      Grafo que representa el MIP
    dinamica : Callable 
      Función con la siguiente signatura : (aumento, peso_arista, inflacion, alpha)
    duracion_periodo : int, opcional
        La duración de cada período en pasos para actualizar la inflacion, por defecto 10 pasos.
    metricas : Dict(string,Callable), opcional
        Diccionario de con metricas a computar sobre el grafo, ej, {"cantidad_nodos", lambda grafo: len(grafo)}
    calcular_inflacion : Callable, opcional
        Función para calcular la inflación en un período, recibe dos arrays de precios. ej, calc(precios_actual, precios_pasado)
    alpha : float, opcional
        Parametro de ponderacion
        El alpha es CUANTO ve la inflación. 
        Alpha == 1 es lo mismo que la dinamica 2. 
        Alpha == 0 es lo mismo que la dinamica 1.
    """
    self.grafo = grafo.copy()
    self.dinamica = dinamica
    self.metricas = metricas or {}
    self._curr_step = 0
    self.metricas_evaluadas = {nombre:[] for nombre in self.metricas}
    self.metricas_evaluadas['inflacion'] = []
    self.queue = queue.Queue() #Fila de tuplas (Nodo, aumento)
    self.duracion_periodo = duracion_periodo
    self.precios_periodo_pasado = {}
    for nodo in self.grafo.nodes:
      self.precios_periodo_pasado[nodo] = self.grafo.nodes[nodo]['precio']

    self._calc_inflacion = calcular_inflacion or (lambda actual, pasado: 0.0)
    self.inflacion = 0 # Expresada en %. (50 para 50%, 12 para 12%)
    assert 0.0 <= alpha <= 1.0
    self.alpha = alpha

  def shock(self, nodo, aumento):
    precio_actual = self.grafo.nodes[nodo]['precio']
    nuevo_precio = { nodo : { 'precio': (precio_actual * (1 + (aumento/100)))}}
    nx.set_node_attributes(self.grafo, nuevo_precio)
    vecinos = self.grafo[nodo].items()
    aumentos_a_pasar = []
    for vecino in vecinos:
      aumento_vecino = self.actualizar(vecino,aumento)
      aumentos_a_pasar.append(aumento_vecino)
    for i, vecino in enumerate(vecinos):
      self.queue.put((vecino[0], aumentos_a_pasar[i]))

  def step(self, n=1): # aumento pasado en %.
    for _ in range(n):
        self._single_step()
        self._calcular_metricas()
        self._curr_step += 1

  def actualizar(self, vecino, aumento):   
    nodo_vecino = vecino[0]
    precio_actual = self.grafo.nodes[nodo_vecino]['precio']
    peso_arista = vecino[1]['w']
    aumento_vecino = self.dinamica(aumento, peso_arista, self.inflacion, self.alpha)
    nuevo_precio = {nodo_vecino : {'precio':  (precio_actual * (1 + (aumento_vecino / 100)))}}
    nx.set_node_attributes(self.grafo, nuevo_precio)
    return aumento_vecino

  def _single_step(self):
    if self._curr_step % self.duracion_periodo == 0:
      self.actualizar_inflacion()

    if not self.queue.empty():
      nodo_actual, aumento = self.queue.get()
      vecinos = self.grafo[nodo_actual].items()
      aumentos_a_pasar = []
      for vecino in vecinos:
        aumento_vecino = self.actualizar(vecino,aumento) #Side effect actualiza ese vecino.
        aumentos_a_pasar.append(aumento_vecino)
      for i, vecino in enumerate(vecinos):
        self.queue.put((vecino[0], aumentos_a_pasar[i]))

  def actualizar_inflacion(self): 
      precios_periodo_actual = {}
      for nodo in self.grafo.nodes:
        precios_periodo_actual[nodo] = self.grafo.nodes[nodo]['precio']      
      self.inflacion = self._calc_inflacion(precios_periodo_actual.values(), self.precios_periodo_pasado.values())
      self.precios_periodo_pasado = precios_periodo_actual.copy()
  def _calcular_metricas(self):
    self.metricas_evaluadas['inflacion'].append(self.inflacion)
    for nombre, metrica in self.metricas.items():
          self.metricas_evaluadas[nombre].append(metrica(self.grafo))

  def __str__(self):
      return str(self.to_dict())

  def __repr__(self):
      return str(self)

  def to_dict(self):
      return {"id_grafo": hash(self.grafo), "step": self._curr_step, "metricas": self._metricas_evaluadas}
File:           c:\users\augus\dev\gh\akielbowicz\tp-msscae-2024\src\experimento.py
Type:           type
Subclasses:     

Dinámicas¶

In [40]:
modelo.dinamica_local??
Signature: modelo.dinamica_local(aumento, peso_arista, inflacion=0.0, alpha=1.0)
Docstring: <no docstring>
Source:   
def dinamica_1(aumento, peso_arista, inflacion=0.0, alpha=1.0):
    aumento_vecino = aumento * peso_arista
    return aumento_vecino
File:      c:\users\augus\dev\gh\akielbowicz\tp-msscae-2024\src\modelo.py
Type:      function
In [41]:
modelo.dinamica_global??
Signature: modelo.dinamica_global(aumento, peso_arista, inflacion, alpha=1.0)
Docstring: <no docstring>
Source:   
def dinamica_2(aumento, peso_arista, inflacion, alpha=1.0):
    aumento_vecino = inflacion
    return aumento_vecino
File:      c:\users\augus\dev\gh\akielbowicz\tp-msscae-2024\src\modelo.py
Type:      function
In [42]:
modelo.dinamica_mixta??
Signature: modelo.dinamica_mixta(aumento, peso_arista, inflacion, alpha)
Docstring: <no docstring>
Source:   
def dinamica_3(aumento, peso_arista, inflacion, alpha):
    aumento_vecino = (alpha * inflacion) + ((1 - alpha) * ((aumento) * peso_arista))
    return aumento_vecino
File:      c:\users\augus\dev\gh\akielbowicz\tp-msscae-2024\src\modelo.py
Type:      function